package com.imti.customview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import androidx.annotation.Nullable;

public class MyView extends View
{

    private int mCircleColor;

    //四个构造方法根据View使用的场景不同，重写不同的构造方法

    //此构造方法适用场景
    //控件仅在Java代码中通过new的方式创建，并通过ViewGroup.addView()添加时重写
    public MyView(Context context)
    {
        super(context);
    }
    //应用场景
    //控件需要通过XML布局文件中配置时重写
    //AttributeSet 即控件在xml布局中的属性及属性值
    public MyView(Context context, @Nullable AttributeSet attrs)
    {
        super(context, attrs);

        //获取在Styleable中声明的属性集合
        TypedArray customAttrs =
            context.obtainStyledAttributes(attrs, R.styleable.MyView);

        //xml中设置的自定义属性app:circle_color的值
        //参数2：为默认值
        mCircleColor = customAttrs.getColor(
            R.styleable.MyView_circle_color, Color.RED);

        customAttrs.recycle();
    }
    //应用场景
    //当控件即可在xml中使用，同时允许在xml布局中使用Style风格时重写
    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);

    }
    //应用场景
    //当控件不仅在xml中使用，同时使用style风格，并且支持style的xml配置时使用
    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
    {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        //设置控件wrap_content时的最小尺寸
        //注意：实际应用时，wrap_content最小尺寸应根据控件的显示内容动态计算
        int minWidth = 100;
        int minHeight = 100;

        //当xml中宽高同时为WRAP_CONTENT，则设置控件的最小宽高
        if (getLayoutParams().height == LayoutParams.WRAP_CONTENT
                && getLayoutParams().width == LayoutParams.WRAP_CONTENT)
        {
            setMeasuredDimension(minWidth, minHeight);
        }
        //当高度为WRAP_CONTENT时，宽度为其他值
        else if (getLayoutParams().height == LayoutParams.WRAP_CONTENT)
        {
            setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
                minHeight);
        }
        //当宽度为WRAP_CONTENT时，高度为其他值
        else if (getLayoutParams().width == LayoutParams.WRAP_CONTENT)
        {
            setMeasuredDimension(minWidth,
                MeasureSpec.getSize(heightMeasureSpec));
        }
    }
    //draw绘制过程的回调方法
    //canvas 画布，绘制View内容的重要组件
    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        //画笔
        Paint paint = new Paint();

        //设置画笔颜色
        paint.setColor(mCircleColor);
//        paint.setColor(Color.parseColor("#FF3700B3"));

        //设置padding内边距在onDraw()方法内
        //设置margin外边距在onLayout()方法内
        int paddingLeft = getPaddingLeft();
        int paddingRight = getPaddingRight();
        int paddingTop = getPaddingTop();
        int paddingBottom = getPaddingBottom();

        int width = getWidth() - paddingLeft - paddingRight;
        int height = getHeight() - paddingTop - paddingBottom;

        int r = Math.min(width, height) / 2;

        //具体绘制(圆心所在位置为控件的中心，半径为宽高中最小值的一半)
        //参数1和参数2：圆心坐标(x,y)
        //参数3：圆的半径
        //参数4：paint对象
        canvas.drawCircle((float) getWidth() / 2, (float) getHeight() / 2, r, paint);
    }
}
